package com.keli.dt.algorithm;

import java.util.HashMap;
import java.util.Map;

import org.apache.log4j.Logger;

/**
 * 路况接口
 */
public abstract class RoadInfo {	
	/**  */
	public static final double[] TPIS = {2, 4, 6, 8, 10};
	/** 道路运行状态 */
	public static final String[] STATUSES = {"畅通", "基本畅通", "轻度拥堵", "中度拥堵", "重度拥堵"};
	/** 道路等级，0高速，1国道，2省道，3县道，4乡道，5快速路，6主干道，7次干道，8支路，9非导航道路。 */
	/** 键值对：key:道路等级, value:自由流车速 */
	public static final Map<Integer, Double> TYPE2VF;
	
	static {
		TYPE2VF = new HashMap<Integer, Double>();
		TYPE2VF.put(new Integer(5), new Double(80));
		TYPE2VF.put(new Integer(6), new Double(60));
		TYPE2VF.put(new Integer(7), new Double(40));
		TYPE2VF.put(new Integer(8), new Double(30));
	}
	
	private Logger log = Logger.getLogger(getClass());
	
	/**
	 * 计算TPI道路指数
	 * @param speed 路段平均速度
	 * @param roadType 道路类型
	 * @return
	 */
	public abstract double calcTPI(double speed, int roadType);
	
	/**
	 * 获取自由流车速
	 * @param roadType 道路类型
	 * @return 未找到返回0
	 */
	public double getFreeflowSpeed(int roadType) {
		Double vf = TYPE2VF.get(new Integer(roadType));
		if (vf == null) {
			log.error("Not found Vf with type: " + roadType);
			return 0;
		}
		
		return vf.doubleValue();
	}
	
	/**
	 * 获取道路运行状态
	 * @param tpi tpi指数
	 * @return
	 */
	public String getRoadStatus(double tpi) {
		if (tpi < 0 || tpi > TPIS[TPIS.length - 1]) {
			log.error("tpi:" + tpi +" out of range");
			return "未知状态";
		}
		
		int i = 0;
		for (; i < TPIS.length; i++) {
			if (tpi <= TPIS[i]) {
				break;
			}
		}
		return STATUSES[i];
	}
}
